package com.zkas.cuit;

import com.googlecode.tesseract.android.TessBaseAPI;

import android.graphics.Bitmap;
import android.os.Environment;

public class CuitReader {

	private static String getCuitFromText(String stringData) {
		String cuit = "";
		String myString = stringData.trim();
		int posg1 = myString.indexOf("-"); // primer guion.
		int posg2 = 0;
		int mslen = myString.length();
		String guion2 = "";
		while (posg1 >= 0 && posg1 + 10 < mslen) {
			// busco el proximo guion.
			guion2 = myString.substring(posg1 + 9, posg1 + 10);
			if (guion2.equals("-")) {
				// verifico que son todos numeros.
				cuit = myString.substring(posg1 - 2, posg1)
						+ myString.substring(posg1 + 1, posg1 + 1 + 8)
						+ myString.substring(posg1 + 10, posg1 + 10 + 1);
				if (!isNumeric(cuit))
					cuit = "";
				else
					break;
			}
			posg2 = myString.substring(posg1 + 1).indexOf("-"); // siguiente
																// guion.
			if (posg2 > 0)
				posg1 += posg2 + 1;
			else
				posg1 = -1;
		}
		return cuit;
	}

	private static boolean isNumeric(String cuit) {
		boolean isnumeric = false;

		if (cuit != null && !cuit.equals("")) {
			isnumeric = true;
			char chars[] = cuit.toCharArray();

			for (int d = 0; d < chars.length; d++) {
				isnumeric &= Character.isDigit(chars[d]);

				if (!isnumeric)
					break;
			}
		}
		return isnumeric;
	}

	public static String getCuit(Bitmap bitmap) {

		TessBaseAPI baseApi = new TessBaseAPI();
		String mydir = Environment.getExternalStorageDirectory().getAbsolutePath()+"/tesseract"; 
		baseApi.init(mydir, "eng");
		baseApi.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, "0123456789-");
		baseApi.setImage(bitmap);
		try {
			String recognizedText = baseApi.getUTF8Text();
			return getCuitFromText(recognizedText);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public static boolean validar(String cuit) {
		
		if (cuit == null || cuit.length()<11) {
			return false;
		}
		
		// la secuencia de valores de factor es 5, 4, 3, 2, 7, 6, 5, 4, 3, 2
		int factor = 5;

		int[] c = new int[11];
		int resultado = 0;
		c[10] = Integer.valueOf(Character.toString(cuit.charAt(10))).intValue();

		for (int i = 0; i < 10; i++) {
			// se toma el valor de cada cifra
			c[i] = Integer.valueOf(Character.toString(cuit.charAt(i))).intValue();
			// se suma al resultado el producto de la cifra por el factor que
			// corresponde
			resultado = resultado + c[i] * factor;
			// se actualiza el valor del factor
			factor = (factor == 2) ? 7 : factor - 1;
		}

		// se obtiene el valor calculado a comparar
		int control = (11 - (resultado % 11)) % 11;

		// Si la cifra de control es igual al valor calculado
		return control == c[10];
	}
}
